// 多态基础
// 查看对象模型
// cl /d1 reportSingleClassLayoutAnimal "polymorphismBasic.cpp"
// cl /d1 reportSingleClassLayoutCat "polymorphismBasic.cpp"
#include <iostream>
using namespace std;
// Animal对象模型包括vfptr(虚函数指针), vfptr指向vftable(虚函数表)
class Animal {
public:
    // 虚函数
    virtual void speak() {
        cout << "动物说话" << endl;
    }
};
// Cat对象模型包括继承下来的vfptr，虚函数表中重写的Cat::speak会覆盖之前的Animal::speak
class Cat: public Animal {
public:
    void speak() {
        cout << "猫猫说话" << endl;
    }
};
void doSpeak(Animal &animal) {
    animal.speak();
}
void test1() {
    Cat c1;
    doSpeak(c1);
}
void test2() {
    cout << "sizeof(Animal) = " << sizeof(Animal) << endl;
}
int main(void) {
    test1();
    test2();

    return 0;
}